#ifndef FILEORDERMANAGER_H
#define FILEORDERMANAGER_H

#include <QObject>
#include <QStringList>
#include <QMap>
#include "unifiedfileinfo.h"

/**
 * @brief 文件顺序管理器 - Martin Fowler重构：单一职责原则
 *
 * 专门负责：
 * - 文件顺序维护
 * - 文件元数据管理
 * - 顺序变更通知
 *
 * 设计原则：
 * - Single Responsibility: 只负责文件顺序和元数据
 * - Observer Pattern: 顺序变更时通知观察者
 * - Information Expert: 包含所有文件相关的专家信息
 */
class FileOrderManager : public QObject
{
    Q_OBJECT

public:
    explicit FileOrderManager(QObject* parent = nullptr);
    ~FileOrderManager() = default;

    // === 文件顺序管理 ===

    /**
     * @brief 添加文件到指定位置
     * @param fileInfo 文件信息
     * @param position 插入位置，-1表示末尾
     */
    void addFile(const UnifiedFileInfo& fileInfo, int position = -1);

    /**
     * @brief 移除文件
     * @param fileIdentity 文件唯一标识
     */
    void removeFile(const QString& fileIdentity);

    /**
     * @brief 移动文件到新位置
     * @param fileIdentity 文件唯一标识
     * @param newPosition 新位置
     */
    void moveFile(const QString& fileIdentity, int newPosition);

    /**
     * @brief 重新排序文件
     * @param newOrder 新的文件标识顺序
     */
    void reorderFiles(const QStringList& newOrder);

    // === 文件信息访问 ===

    /**
     * @brief 获取所有文件（按顺序）
     * @return 文件信息列表
     */
    QList<UnifiedFileInfo> getOrderedFiles() const;

    /**
     * @brief 获取文件在顺序中的位置
     * @param fileIdentity 文件唯一标识
     * @return 位置索引，如果不存在返回-1
     */
    int getFilePosition(const QString& fileIdentity) const;

    /**
     * @brief 获取指定位置的文件信息
     * @param position 位置索引
     * @return 文件信息，无效位置返回空UnifiedFileInfo
     */
    UnifiedFileInfo getFileAt(int position) const;

    /**
     * @brief 获取文件总数
     * @return 文件数量
     */
    int getFileCount() const { return m_orderedFiles.size(); }

    /**
     * @brief 检查文件是否存在
     * @param fileIdentity 文件唯一标识
     * @return 是否存在
     */
    bool hasFile(const QString& fileIdentity) const;

    // === 文件元数据更新 ===

    /**
     * @brief 更新文件信息
     * @param fileIdentity 文件唯一标识
     * @param fileInfo 新的文件信息
     */
    void updateFileInfo(const QString& fileIdentity, const UnifiedFileInfo& fileInfo);

    /**
     * @brief 获取文件信息
     * @param fileIdentity 文件唯一标识
     * @return 文件信息
     */
    UnifiedFileInfo getFileInfo(const QString& fileIdentity) const;

signals:
    /**
     * @brief 文件顺序发生变化
     */
    void fileOrderChanged();

    /**
     * @brief 文件信息发生变化
     * @param fileIdentity 文件唯一标识
     */
    void fileInfoChanged(const QString& fileIdentity);

    /**
     * @brief 文件被添加
     * @param fileIdentity 文件唯一标识
     * @param position 添加位置
     */
    void fileAdded(const QString& fileIdentity, int position);

    /**
     * @brief 文件被移除
     * @param fileIdentity 文件唯一标识
     * @param position 移除前的位置
     */
    void fileRemoved(const QString& fileIdentity, int position);

private:
    // 核心数据结构：按顺序存储的文件列表
    QList<UnifiedFileInfo> m_orderedFiles;

    // 快速查找映射：文件标识 -> 文件信息
    QMap<QString, UnifiedFileInfo> m_fileMap;

    /**
     * @brief 重建快速查找映射
     */
    void rebuildFileMap();
};

#endif // FILEORDERMANAGER_H